#pragma once

/* These are copied from WindowsStorageCOM.h
 * You can remove this header file once the real file has been updated
 * to fix the WINAPI_PARTITION_DESKTOP block */

typedef interface IOplockBreakingHandler IOplockBreakingHandler;
typedef interface IStorageItemHandleAccess IStorageItemHandleAccess;
typedef interface IStorageFolderHandleAccess IStorageFolderHandleAccess;

#ifdef __cplusplus
extern "C" {
#endif

   typedef /* [v1_enum] */
      enum HANDLE_OPTIONS {
      HO_NONE = 0,
      HO_OPEN_REQUIRING_OPLOCK = 0x40000,
      HO_DELETE_ON_CLOSE = 0x4000000,
      HO_SEQUENTIAL_SCAN = 0x8000000,
      HO_RANDOM_ACCESS = 0x10000000,
      HO_NO_BUFFERING = 0x20000000,
      HO_OVERLAPPED = 0x40000000,
      HO_WRITE_THROUGH = 0x80000000
   } HANDLE_OPTIONS;

   DEFINE_ENUM_FLAG_OPERATORS(HANDLE_OPTIONS);
   typedef /* [v1_enum] */
      enum HANDLE_ACCESS_OPTIONS {
      HAO_NONE = 0,
      HAO_READ_ATTRIBUTES = 0x80,
      HAO_READ = 0x120089,
      HAO_WRITE = 0x120116,
      HAO_DELETE = 0x10000
   } HANDLE_ACCESS_OPTIONS;

   DEFINE_ENUM_FLAG_OPERATORS(HANDLE_ACCESS_OPTIONS);
   typedef /* [v1_enum] */
      enum HANDLE_SHARING_OPTIONS {
      HSO_SHARE_NONE = 0,
      HSO_SHARE_READ = 0x1,
      HSO_SHARE_WRITE = 0x2,
      HSO_SHARE_DELETE = 0x4
   } HANDLE_SHARING_OPTIONS;

   DEFINE_ENUM_FLAG_OPERATORS(HANDLE_SHARING_OPTIONS);
   typedef /* [v1_enum] */
      enum HANDLE_CREATION_OPTIONS {
      HCO_CREATE_NEW = 0x1,
      HCO_CREATE_ALWAYS = 0x2,
      HCO_OPEN_EXISTING = 0x3,
      HCO_OPEN_ALWAYS = 0x4,
      HCO_TRUNCATE_EXISTING = 0x5
   } HANDLE_CREATION_OPTIONS;

   EXTERN_C const IID IID_IOplockBreakingHandler;
   MIDL_INTERFACE("826ABE3D-3ACD-47D3-84F2-88AAEDCF6304")
      IOplockBreakingHandler : public IUnknown
   {
      public:
       virtual HRESULT STDMETHODCALLTYPE OplockBreaking(void) = 0;
   };

   EXTERN_C const IID IID_IStorageItemHandleAccess;
   MIDL_INTERFACE("5CA296B2-2C25-4D22-B785-B885C8201E6A")
      IStorageItemHandleAccess : public IUnknown
   {
      public:
       virtual HRESULT STDMETHODCALLTYPE Create(
          /* [in] */ HANDLE_ACCESS_OPTIONS accessOptions,
          /* [in] */ HANDLE_SHARING_OPTIONS sharingOptions,
          /* [in] */ HANDLE_OPTIONS options,
          /* [optional][in] */ __RPC__in_opt IOplockBreakingHandler * oplockBreakingHandler,
          /* [system_handle][retval][out] */ __RPC__deref_out_opt HANDLE * interopHandle) = 0;
   };

   EXTERN_C const IID IID_IStorageFolderHandleAccess;
   MIDL_INTERFACE("DF19938F-5462-48A0-BE65-D2A3271A08D6")
      IStorageFolderHandleAccess : public IUnknown
   {
      public:
       virtual HRESULT STDMETHODCALLTYPE Create(
          /* [string][in] */ __RPC__in_string LPCWSTR fileName,
          /* [in] */ HANDLE_CREATION_OPTIONS creationOptions,
          /* [in] */ HANDLE_ACCESS_OPTIONS accessOptions,
          /* [in] */ HANDLE_SHARING_OPTIONS sharingOptions,
          /* [in] */ HANDLE_OPTIONS options,
          /* [optional][in] */ __RPC__in_opt IOplockBreakingHandler * oplockBreakingHandler,
          /* [system_handle][retval][out] */ __RPC__deref_out_opt HANDLE * interopHandle) = 0;
   };
#ifdef __cplusplus
}
#endif
